package com.javaDemo.ti;

import java.util.Arrays;

/**
 * 测试类：用于测试MaxNumberFromArray类的功能
 * <p>
 * 问题描述：
 * 给定一个数n，如23121；给定一组数字A，如{2,4,9}，
 * 求由A中元素组成的、小于n的最大数，如小于23121的最大数为22999。
 *
 * @author AI Assistant
 * @date 2024/05/15
 */
public class MaxNumberTest {

    public static void main(String[] args) {
        // 测试用户提供的例子
        int[] arr = {2, 4, 9}; // 给定的数字集合
        long n = 23121;        // 目标数字
        
        System.out.println("问题：给定一个数n=" + n + "，给定一组数字A=" + Arrays.toString(arr) + "，");
        System.out.println("求由A中元素组成的、小于n的最大数。");
        System.out.println();
        
        // 对数组进行降序排序（MaxNumberFromArray类要求输入数组是降序排列的）
        Integer[] arrObj = Arrays.stream(arr).boxed().toArray(Integer[]::new);
        Arrays.sort(arrObj, (a, b) -> b - a);
        int[] sortedArr = Arrays.stream(arrObj).mapToInt(Integer::intValue).toArray();
        
        System.out.println("降序排列后的数组：" + Arrays.toString(sortedArr));
        System.out.println();
        
        // 使用三种不同的算法求解
        System.out.println("解法1（迭代法）结果：" + MaxNumberFromArray.findMaxLessOrEqual(sortedArr, n));
        System.out.println("解法2（贪心算法）结果：" + MaxNumberFromArray.findMaxLessOrEqualGreedy(sortedArr, n));
        System.out.println("解法3（回溯算法）结果：" + MaxNumberFromArray.findMaxLessOrEqualBacktrack(sortedArr, n));
        
        // 添加更多测试用例
        System.out.println("\n更多测试用例：");
        
        // 测试用例1：数组元素可以组成等于目标数的数字
        testCase(new int[]{1, 2, 3}, 123, "数组元素可以组成等于目标数的数字");
        
        // 测试用例2：需要回退的情况
        testCase(new int[]{2, 5, 9}, 5243, "需要回退的情况");
        
        // 测试用例3：无法组成小于等于目标数的数字
        testCase(new int[]{5, 6, 8}, 234, "无法组成小于等于目标数的数字");
    }
    
    /**
     * 辅助方法：运行测试用例
     * 
     * @param arr 输入数组
     * @param n 目标数字
     * @param description 测试用例描述
     */
    private static void testCase(int[] arr, long n, String description) {
        System.out.println("测试用例：" + description);
        System.out.println("数组：" + Arrays.toString(arr));
        System.out.println("目标数：" + n);
        
        // 对数组进行降序排序
        Integer[] arrObj = Arrays.stream(arr).boxed().toArray(Integer[]::new);
        Arrays.sort(arrObj, (a, b) -> b - a);
        int[] sortedArr = Arrays.stream(arrObj).mapToInt(Integer::intValue).toArray();
        
        System.out.println("降序排列后的数组：" + Arrays.toString(sortedArr));
        System.out.println("解法1结果：" + MaxNumberFromArray.findMaxLessOrEqual(sortedArr, n));
        System.out.println("解法2结果：" + MaxNumberFromArray.findMaxLessOrEqualGreedy(sortedArr, n));
        System.out.println("解法3结果：" + MaxNumberFromArray.findMaxLessOrEqualBacktrack(sortedArr, n));
        System.out.println();
    }
}